package com.example.springboottaskscheduler.task;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by IntelliJ IDEA2022.3.2
 * @Author: Tenghw
 * @Date: 2023/05/08  20:27
 * @Description: 具体任务实现
 */
@Data
public class CronTaskRunnable implements Runnable {

    private static final Logger log = LoggerFactory.getLogger(CronTaskRunnable.class);

    /**
     * 任务id（必须唯一）
     */
    private String taskId;
    /**
     * 任务类型：自定义；比如：1:结算，2:库存清点
     */
    private Integer taskType;
    /**
     * 任务名字
     */
    private String taskName;
    /**
     * 任务参数
     */
    private Object[] params;

    public CronTaskRunnable() {
    }

    public CronTaskRunnable(String taskId, Integer taskType, String taskName, Object ... params) {
        this.taskId = taskId;
        this.taskType = taskType;
        this.taskName = taskName;
        this.params = params;
    }

    /**
     * 执行任务
     **/
    @Override
    public void run() {
        long start = System.currentTimeMillis();
        log.info("----------定时任务执行start----------");
        //具体的任务。
        log.info("\n\t {}号.定时任务开始执行 - taskId：{}，taskName：{}，taskType：{}，params：{}",
                taskType, taskId, taskName, taskType, params);
        //任务处理的方式：
        /**
         * 说明：
         * 1就在这里执行 模拟任务
         * 2开启策略模式，根据任务类型 调度不同的任务
         * 3使用反射：传来bean名字，方法名字，调用不同的任务
         * 4开启队列，把要执行的任务放到队列中，然后执行 —— 使用场景：每个任务执行很耗时的情况下使用
         */
        //我这里具体任务就输出如下日志算了，生产中此处写执行的具体任务逻辑代码，比如：去数据库扣减下库存
        log.warn("定时任务执行中...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("\n\t {}号.任务执行完成 - 耗时：{}，taskId：{}，taskType：{}",
                taskType, System.currentTimeMillis() - start, taskId, taskType);
        log.info("----------定时任务执行end----------");
    }
}
